home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / asmutil / asm_n_z.zip / OWNER.ASM < prev    next >
Assembly Source File  |  1987-04-21  |  30KB  |  676 lines

  1. PAGE ,132
  2. TITLE Cluster Owner Program, Version 1.61, 21-Apr-1987
  3.  
  4. ;
  5. ; Written By Steven Georgiades
  6. ;
  7. ;
  8. ;       If you have any questions or comments about this or any other
  9. ;       SMG program, call or write:
  10. ;
  11. ;               Steven M. Georgiades
  12. ;               SMG Software
  13. ;               701-H South Hayward Street
  14. ;               Anaheim, CA 92804
  15. ;
  16.  
  17. CODE      SEGMENT BYTE PUBLIC 'CODE'
  18.  
  19.           ASSUME  CS:CODE,DS:CODE,ES:CODE,SS:CODE
  20.  
  21.           ORG     5CH
  22.  
  23. FCB       LABEL   BYTE
  24.  
  25.           ORG     80H
  26.  
  27. PARAM     LABEL   BYTE
  28.  
  29.           ORG     100H
  30.  
  31. OWNER:    JMP     BEGIN
  32.  
  33. DIGIT     DB      "0123456789ABCDEF"
  34. PARM_ERR  DB      "Illegal Parameter!",7
  35. CRLF      DB      13,10,"$"
  36. READERR   DB      "Error Reading Drive X:",7,13,10,"$"
  37. SIGNON    DB      "Cluster Owner Program, Version 1.61",13,10
  38.           DB      "SMG Software",13,10
  39.           DB      "(C) Copyright 1986,1987 Steven Georgiades",13,10,10,"$"
  40. USAGE     DB      "Usage:",13,10,10
  41.           DB      "  OWNER [d:] n [[d:] n [...]]",13,10,10
  42.           DB      "    d: = Optional Drive Letter",13,10
  43.           DB      "    n  = Cluster Number to Check",13,10,10,"$"
  44. CLUSTMSG  DB      "Cluster XXXXX $"
  45. OWNERMSG  DB      "is Owned by $"
  46. BADMSG    DB      "is Marked as Bad",13,10,"$"
  47. FREEMSG   DB      "is not is Use by any File",13,10,"$"
  48. INVALID   DB      "does not Exist!",7,13,10,"$"
  49. LOSTMSG   DB      "Appears to be Lost!",7,13,10,"$"
  50. RESVMSG   DB      "is Reserved",13,10,"$"
  51.  
  52. CLSTSEC   DW      ?
  53. CLSTTOT   DW      ?
  54. CLUST     DW      ?
  55. DIR_LEN   DW      ?
  56. DIRBUF    DW      ?
  57. DIRSEC    DW      ?
  58. DRIVE     DB      ?
  59. EOF       DW      0FF8H
  60. FATSEC    DW      ?
  61. FATSIZE   DB      3
  62. LASTDRV   DB      -1
  63. RDIR_LEN  DW      ?
  64. SECSIZE   DW      ?
  65. STARTSEC  DW      ?
  66.  
  67. DIRNAME   DB      14 DUP(?)
  68. FILESPEC  DB      "X:\"
  69. PATH      DB      "$",79 DUP(?)
  70. FILENAME  DB      14 DUP(?)
  71.  
  72. BEGIN:    MOV     AH,9                          ; Output Sign-On Message
  73.           MOV     DX,OFFSET SIGNON
  74.           INT     21H
  75.           MOV     AH,19H                        ; Get Default Drive Number
  76.           INT     21H
  77.           MOV     DRIVE,AL                      ;   and Save
  78.           MOV     SI,OFFSET PARAM               ; Set up Pointer to Parameter
  79.           LODSB                                 ; Read Parameter Length
  80.           CMP     AL,2
  81.           JNB     GET_PARM
  82.           MOV     DX,OFFSET USAGE
  83.           JMP     SHORT GET_OW03
  84. GET_PARM: CBW
  85.           MOV     BX,AX
  86.           MOV     BYTE PTR [SI][BX],0           ; Terminate Parameter String
  87. STRIP:    LODSB                                 ; Strip Off Leading Whitespace
  88.           CMP     AL,' '
  89.           JE      STRIP
  90.           CMP     AL,9
  91.           JE      STRIP
  92.           OR      AL,AL                         ; If End-of-Parameter,
  93.           JZ      EXIT                          ;   Continue Proccessing
  94.           CMP     BYTE PTR [SI],':'             ; If Drive Letter,
  95.           JNE     NOTDRIVE
  96.           AND     AL,0DFH                       ;   Convert to Drive Number
  97.           SUB     AL,'A'
  98.           MOV     DRIVE,AL                      ;   and Save
  99.           LODSB                                 ;   Skip Colon
  100.           JMP     SHORT STRIP                   ;   Continue
  101. NOTDRIVE: DEC     SI                            ; ReUse Last Character
  102.           CALL    GET_WORD                      ; Read Cluster Number (Hex)
  103.           JNE     PARM_OK                       ; If Error,
  104. PARMERR:  MOV     DX,OFFSET PARM_ERR            ;   Output Parameter Error
  105.           MOV     AH,9
  106.           INT     21H
  107.           MOV     AX,4C01H                      ;   Exit to DOS
  108.           INT     21H
  109. PARM_OK:  MOV     CLUST,DX                      ; Save Cluster Number
  110.           CALL    GET_OWNR                      ; Find Cluster Owner
  111.           JMP     SHORT STRIP                   ; Get Next Parameter
  112. EXIT:     MOV     AX,4C00H                      ; Exit to DOS
  113.           INT     21H
  114.  
  115. GET_OWNR: PUSH    AX                            ; Save Registers
  116.           PUSH    BX
  117.           PUSH    CX
  118.           PUSH    DX
  119.           PUSH    DI
  120.           PUSH    SI
  121.           MOV     PATH,'$'                      ; Initialize Path
  122.           MOV     AL,DRIVE                      ; If drive has changed,
  123.           CMP     AL,LASTDRV
  124.           JNE     GET_OW01
  125.           JMP     GET_OW07
  126. GET_OW01: MOV     LASTDRV,AL                    ;   Last Drive = This Drive
  127.           MOV     CX,1                          ;   Read Boot Record
  128.           MOV     DX,0
  129.           MOV     BX,OFFSET FATBUF
  130.           INT     25H
  131.           JNC     GET_OW04                      ;   If Error,
  132. GET_OW02: POPF
  133.           MOV     AL,DRIVE                      ;     Convert Drive Number
  134.           ADD     AL,'A'
  135.           MOV     READERR[20],AL
  136.           MOV     DX,OFFSET READERR             ;     Point to Read Error
  137. GET_OW03: MOV     AH,9                          ;     Output Error Message
  138.           INT     21H
  139.           MOV     AX,4C01H                      ;     Exit to DOS
  140.           INT     21H
  141. GET_OW04: POPF
  142.           MOV     AX,FATBUF[11]                 ;   Read Sector Size
  143.           MOV     SECSIZE,AX                    ;     and Save
  144.           MOV     AL,BYTE PTR FATBUF[13]        ;   Read Sectors per Cluster
  145.           XOR     AH,AH
  146.           MOV     CLSTSEC,AX                    ;     and Save
  147.           MOV     CX,FATBUF[14]                 ;   Read # of Reserved Sectors
  148.           MOV     AL,BYTE PTR FATBUF[16]        ;   Read # of FAT's
  149.           XOR     AH,AH                         ;   Convert to Word
  150.           MOV     BX,FATBUF[22]                 ;   Read Sectors per FAT
  151.           MOV     FATSEC,BX
  152.           MUL     BX                            ;   Calculate Total FAT Sectors
  153.           ADD     CX,AX                         ;   Add to Reserved Sectors
  154.           MOV     AX,FATBUF[17]                 ;   Read Number of DIR Entries
  155.           MOV     RDIR_LEN,AX
  156.           PUSH    CX                            ;   Calculate DIR Sectors
  157.           MOV     CL,5
  158.           SHL     AX,CL
  159.           POP     CX
  160.           MOV     BX,SECSIZE
  161.           XOR     DX,DX
  162.           DIV     BX
  163.           OR      DX,DX                         ;   Adjust for Partial Sector
  164.           JZ      GET_OW05
  165.           INC     AX
  166. GET_OW05: MOV     DIRSEC,AX                     ;   Save DIR Sectors
  167.           ADD     CX,AX                         ;   Add DIR Sectors to Reserved
  168.           MOV     STARTSEC,CX                   ;   Save in STARTSEC
  169.           MOV     AX,FATSEC                     ;   Determine FAT Buffer Size
  170.           MOV     BX,SECSIZE
  171.           MUL     BX
  172.           ADD     AX,OFFSET FATBUF
  173.           MOV     DIRBUF,AX                     ;   Save DIRBUF Pointer
  174.           MOV     AX,FATBUF[19]                 ;   Read Total Sectors on Media
  175.           SUB     AX,CX                         ;   Calc. Total Data Clusters
  176.           MOV     BX,CLSTSEC
  177.           XOR     DX,DX
  178.           DIV     BX
  179.           ADD     AX,2
  180.           MOV     CLSTTOT,AX                    ;     and Save
  181.           CMP     AX,4081                       ;   Adjust FAT Size
  182.           JLE     GET_OW06
  183.           MOV     FATSIZE,4
  184.           MOV     EOF,0FFF8H
  185.           JMP     SHORT GET_OW07
  186. GET_OW06: MOV     FATSIZE,3
  187.           MOV     EOF,0FF8H                      
  188. GET_OW07: MOV     AL,DRIVE                      ; Read FAT
  189.           MOV     CX,FATSEC
  190.           MOV     DX,1
  191.           MOV     BX,OFFSET FATBUF
  192.           INT     25H
  193.           JNC     GET_OW08
  194.           JMP     GET_OW02                      ; If Error, Say So
  195. GET_OW08: POPF
  196.           MOV     BX,CLUST                      ; Get Cluster Number
  197.           MOV     AX,BX                         ; Convert Cluster # to Decimal
  198.           MOV     DI,OFFSET CLUSTMSG[13]
  199.           CALL    DEC5OUT
  200.           CALL    STRIP0                        ; Strip Off Leading Zeroes
  201.           MOV     AH,9
  202.           MOV     DX,OFFSET CLUSTMSG            ; Output Cluster Message
  203.           INT     21H
  204.           CMP